package com.sutao.thread.创建线程的几种方式;

import java.util.concurrent.*;

/**
 * 第四种获得java多线程的方式--线程池
 * <p>
 * <p>
 * <p>
 * <p>
 * <p>
 * 线程池合理配置线程数
 * <p>
 * CPU密集型：
 * cpu核数+1个线程的线程池
 * <p>
 * <p>
 * IO密集型：
 * 1.由于IO密集型任务线程并不是一直在执行任务，则应配置尽可能多的线程，如CPU核数*2
 * <p>
 * 2.任务需要大量的IO,大部分线程都阻塞，故需要多配置线程数
 * 参考公式：CPU核数/(1-阻塞系数(0.8~09之间))
 * 比如8核CPU：8/(1-0.9)=80个线程数
 */
public class MyThreadPoolDemo {
    public static void main(String[] args) {

        ExecutorService threadPool = new ThreadPoolExecutor(
                3, //线程池中的常驻核心线程数
                5,//线程池能够容纳同时执行的最大线程数，此值必须大于等于1
                1L,//多余空闲线程的存货时间
                TimeUnit.SECONDS,//超时时间单位
                new LinkedBlockingDeque<>(3),//任务队列，被提交但尚未被执行的任务
                Executors.defaultThreadFactory(),//表示生成线程池中工作线程工厂，用于创建线程一般用你默认的。
                new ThreadPoolExecutor.DiscardPolicy());//拒绝策略，表示当队列满了并且工作线程大于等于线程池的最大线程数时如何来拒绝请求执行的runnable策略

//new ThreadPoolExecutor.AbortPolicy(); // 直接抛出RejectedExecutionException异常阻止系统正常运行
//new ThreadPoolExecutor.CallerRunsPolicy(); // 回退到调用者main去运行
//new ThreadPoolExecutor.DiscardOldestPolicy(); // 抛弃队列中等待最久的任务，然后把当前任务加入队列中尝试再次提交任务
//new ThreadPoolExecutor.DiscardPolicy();// 直接丢弃任务，不予任何处理也不抛出异常。如果允许任务丢失，这是最好的一种方案


        // 常用这三个，实际工作中一个都不用
        // ExecutorService threadPool = Executors.newFixedThreadPool(5);// 一池5线程,适用执行长期的任务，性能好很多
        // ExecutorService threadPool = Executors.newSingleThreadExecutor();// 一池1线程，适用一个任务一个任务执行的场景
        //  ExecutorService threadPool = Executors.newCachedThreadPool();// 一池N个处理线程，适用执行很多短期异步的小程序或者负载较轻的服务器
        try {
            // 模拟10个用户来办理业务，每个用户就是一个来自外部的请求线程
            for (int i = 1; i <= 5; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t办理业务");
                });
                // 暂停一会线程
                //  TimeUnit.MILLISECONDS.sleep(200);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}
